﻿// Cow Acrobats POJ - 3045.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-3045

/*
农场主约翰的 N（1 <= N <= 50,000）头奶牛（编号为 1...N）打算逃跑，加入马戏团。
它们的蹄子阻碍了它们走钢丝和荡秋千的能力（它们上次尝试用大炮发射奶牛，结果以失败告终）。
因此，它们决定练习杂技表演。

奶牛们的创造力并不强，只想出了一个杂技绝技：互相站在一起，形成一个有一定高度的垂直堆叠。
奶牛们正试图找出它们在堆叠中的排列顺序。

每 N 头奶牛都有相应的重量（1 <= W_i <= 10,000）和力量（1 <= S_i <= 1,000,000,000）。
一头奶牛倒下的风险等于压在它上面的所有奶牛的总重量（当然不包括它自身的重量）减去它的体力（因此，体力好的奶牛风险较低）。
您的任务是确定奶牛的排序，使任何一头奶牛的倒塌风险降到最低。

输入
* 第 1 行： 一行，包含整数 N。

* 第 2...N+1 行： 第 i+1 行用两个空格分隔的整数 W_i 和 S_i 描述奶牛 i。
输出
* 第 1 行： 单个整数，给出所有奶牛在任何最优排序中的最大风险，使风险最小。

3
10 3
2 5
3 3

2
*/

const int N = 50010;
struct COW {
    int w, s;
}cows[N];

int n;

bool cmp(const struct COW& a, const struct COW& b) {
    return a.w - b.s > b.w - a.s;
}


int main()
{
    //cin >> n;
    scanf("%d",&n);
    for (int i = 1; i <= n; i++) {
        //cin >> cows[i].w >> cows[i].s;
        scanf("%d%d",&(cows[i].w),&(cows[i].s));
    }
    sort(cows + 1, cows + 1 + n,cmp);

    long long  ans = -99999999; long long total = 0;
    for (int i = n; i >= 1; i--) {
        ans = max(total - cows[i].s, ans);
        total += cows[i].w;
    }

    cout << ans << endl;

    return 0;
}

 